import random class Coccinelle: def __init__(self, sexe, age, niv_nutrition): self.age = age self.esperance_de_vie = random.randint(200, 350) self.sexe = sexe self.niv_nutrition = niv_nutrition def chasser(self, nb_proies, nb_coccinelles): """ Simule la chasse d'une coccinelle pendant une journée. Paramètres : - nb_proies : nombre de pucerons disponibles au début de la chasse - nb_coccinelles : nombre total de coccinelles présentes Résultat : - renvoie le nombre de pucerons restants après la consommation Règles : - si aucune coccinelle n'est présente, le nombre de proies ne change pas - la quantité consommée dépend du nombre moyen de proies par coccinelle - si la coccinelle consomme au moins 10 proies, son niveau de nutrition augmente de 1 - sinon, son niveau de nutrition diminue de 1 sans descendre en dessous de 0 """ if nb_coccinelles == 0: return nb_proies proies_par_cocci = nb_proies / nb_coccinelles if proies_par_cocci > 20: consomme = random.randint(12, 20) elif proies_par_cocci > 10: consomme = random.randint(8, 15) else: consomme = random.randint(3, 8) consomme = min(consomme, nb_proies) if consomme >= 10: self.niv_nutrition += 1 else: self.niv_nutrition = max(0, self.niv_nutrition - 1) return nb_proies - consomme def reproduction(self): """ Une femelle avec un niveau de nutrition >= 2 engendre exactement deux descendants : un mâle et une femelle. """ descendants = [] if self.sexe == "femelle" and self.age >= 20 and self.niv_nutrition >= 2: descendants.append(Coccinelle("male", 0, 0)) descendants.append(Coccinelle("femelle", 0, 0)) self.niv_nutrition = 0 return descendants def a_survecu(self): """ Met à jour l'âge de la coccinelle et indique si elle est encore en vie. """ self.age = self.age + 1 if self.age >= self.esperance_de_vie: return False if self.niv_nutrition == 0: return random.randint(1, 3) != 1 return True def __repr__(self): return f"Coccinelle {self.sexe}, âge: {self.age}/{self.esperance_de_vie}, niv_nutrition: {self.niv_nutrition}" def evolution(population, nb_proies): """ Simule une journée dans l'écosystème : - chasse des coccinelles - reproduction - vieillissement et mortalité - croissance des pucerons population est une liste d'instances de la classe Coccinelle nb_proies est un entier indiquant le nombre de proies Cette fonction renvoie un couple (population_suivante, nouveau_nb_proies) indiquant la nouvelle population à la fin de la journée et le nombre de proies. """ population_suivante = [] nouveau_nes = [] nb_coccinelles = len(population) for coccinelle in population: nb_proies = coccinelle.chasser(nb_proies, nb_coccinelles) if coccinelle.a_survecu(): population_suivante.append(coccinelle) nouveau_nes += coccinelle.reproduction() # Croissance naturelle des pucerons (augmentation de 20% par jour) nb_proies = int(nb_proies * 1.2) # Ajout des nouveau-nés en fin de journée population_suivante += nouveau_nes return population_suivante, nb_proies ############################################################################# # Écrire ci-dessous le code pour les questions de l'énoncé # ############################################################################# # question 1 population = [ Coccinelle("femelle", 10, 2), Coccinelle("femelle", 10, 2), Coccinelle("male", 10, 2) ] nb_proies = 200 for jour in range(1, 6): population, nb_proies = evolution(population, nb_proies) print("Jour", jour, ":", len(population), "coccinelles et", nb_proies, "pucerons") #question 2 population = [ Coccinelle("femelle", 10, 2), Coccinelle("femelle", 10, 2), Coccinelle("male", 10, 2) ] nb_proies = 200 def simulation_simple(population, nb_proies): jour = 0 while jour < 30 and len(population) > 0 and nb_proies > 0: population, nb_proies = evolution(population, nb_proies) jour += 1 return len(population), nb_proies, jour print(simulation_simple(population, nb_proies)) # quesion 3 voir docstring, de chasser # question 4 # dans reproduction, on ajoute self.age >= 20 # dans a_survecu, on teste le manque de nutrition avec un tirage aléatoire